#include <stdio.h>
#include <stdarg.h>
// 上面示例中，va_list ap定义ap为可变参数对象，va_start(ap, i)将参数i后面的参数统一放入ap，va_arg(ap, double)用来从ap依次取出一个参数，并且指定该参数为 double 类型，va_end(ap)用来清理可变参数对象。
double average(int i, ...)
{
    double total = 0;
    va_list ap;      // 一个数据类型，用来定义一个可变参数对象。它必须在操作可变参数时，首先使用。
    va_start(ap, i); // 一个函数，用来初始化可变参数对象。它接受两个参数，第一个参数是可变参数对象，第二个参数是原始函数里面，可变参数之前的那个参数，用来为可变参数定位。
    for (int j = 1; j <= i; ++j)
    {
        total += va_arg(ap, double); // 一个函数，用来取出当前那个可变参数，每次调用后，内部指针就会指向下一个可变参数。它接受两个参数，第一个是可变参数对象，第二个是当前可变参数的类型。
    }
    va_end(ap); // 一个函数，用来清理可变参数对象。
    return total / i;
}

int main(void)
{
    double avg = average(3, 1.1, 2.2, 3.3);
    printf("%f\n", avg);
}